#ifndef QR_DETECTOR_H
#define QR_DETECTOR_H

#include <opencv2/core.hpp>
#include <vector>
#include <string>
#include <ZXing/DecodeHints.h>
#include <ZXing/BarcodeFormat.h>
#include <ZXing/ReadBarcode.h>

class QRDetector {
public:
    struct RoiParams {
        double centerScale = 1.1;  // 中心点偏移系数
        double widthScale = 0.1;   // ROI宽度系数
        double heightScale = 1.0;  // ROI高度系数
    };

    QRDetector();

    /**
     * @brief 设置ROI区域计算参数
     * @param centerScale 中心点沿垂直方向的偏移系数
     * @param widthScale ROI宽度与二维码边长的比例
     * @param heightScale ROI高度与二维码边长的比例
     */
    void setRoiParameters(double centerScale, double widthScale, double heightScale);

    /**
     * @brief 检测图像中的二维码并提取ROI区域
     * @param inputImage 输入图像(BGR格式)
     * @return 是否检测到至少一个有效二维码
     * @note 支持同时检测图像中的多个二维码，每个二维码的角点、ROI和内容都会被存储
     */
    bool detect(const cv::Mat& inputImage);

    // Getter方法
    const std::vector<double>& getQrSideLengths() const;
    const std::vector<cv::Mat>& getExtractedROIs() const;
    const cv::Mat& getMarkedImage() const;
    const std::vector<std::vector<cv::Point>>& getAllQrCorners() const;

    /**
     * @brief 获取所有检测到的二维码内容
     * @return 包含所有二维码文本内容的vector，顺序与getAllQrCorners()返回的角点顺序一致
     */
    const std::vector<std::string>& getQrContents() const;

private:
    /**
     * @brief 处理单个二维码的ROI提取
     * @param qrCorners 二维码四个角点(顺序: TL, TR, BR, BL)
     */
    void processSingleQR(const std::vector<cv::Point>& qrCorners);

    // 成员变量
    RoiParams m_roiParams;                         // ROI计算参数
    cv::Mat m_markedImage;                         // 带标注的可视化图像
    std::vector<cv::Mat> m_extractedROIs;          // 提取的所有ROI区域
    std::vector<std::vector<cv::Point>> m_allQrCorners; // 所有二维码角点
    std::vector<double> m_qrSideLengths;           // 所有二维码的边长估算
    std::vector<std::string> m_qrContents;         // 所有二维码的文本内容
};

#endif // QR_DETECTOR_H